package com.baizhi.log;

import com.baizhi.dao.BzLogMapper;
import com.baizhi.entity.BzAdmin;
import com.baizhi.entity.BzLog;
import com.baizhi.util.IPKit;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;

@Configuration
@Aspect
public class LogAspect {
    @Autowired
    private BzLogMapper logMapper;
    @Autowired
    private HttpServletRequest request;
    /**
     * 增强方法
     * 1.采集日志数据
     * 2.日志数据添加数据库
     *
     * 切注解
     */
    @After("@annotation(com.baizhi.log.LogAnnotation)")
    public void logAfter(JoinPoint joinPoint){
        /**
         * 1.采集日志数据
         */
        BzLog log = new BzLog();

//        时间
        log.setLogDate(new Date());

//        获取用户名 Session Request
        BzAdmin admin = (BzAdmin) request.getSession().getAttribute("admin");
        if (admin == null){
            log.setUsername("root");
        }else {
            log.setUsername(admin.getUsername());
        }

//        获取ip Request  获取ip属于基础功能都有对应的工具类可以使用
        String ip = IPKit.getIpAddrByRequest(request);
        log.setLogIp(ip);

//        获取类型和操作内容 type content
        /**
         * 执行的方法不同 类型和操作内容也不同
         * 怎么根据执行的方法的不同 自定义类型和操作内容
         *
         * 查询商品方法 select 查询商品
         * 删除用户的方法 delete 删除用户
         *
         * 通过自定义注解实现  在切面中通过JoinPoint获取注解的值
         *
         * JoinPoint 可以获取目标方法的所有信息
         */
//        1.获取方法签名对象
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//        2.获取方法对象
        Method method = signature.getMethod();
//        3.获取方法上的注解
        LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);
//        4.拿到注解的值
        log.setLogType(annotation.type().name());
        log.setLogContent(annotation.content());

        /**
         * 2.日志数据添加数据库
         */
        logMapper.insert(log);
    }
}
